/* 
   ============================================================================
   Programmname: main.c
   Autor       : Sebastian Spiller
                 HHBK Gruppe A
   Datum       : 07.05.2011   
   Projekt     : C-Spiele
   Version     : 1.0
   Aenderung   : -

   Programmschnittstelle: 

   Hier wird das Spielbrett implementiert.

   ============================================================================ 
*/

/*
============================================================================
Präprozessoranweisungen
============================================================================
*/
#include "util.h"


/* 
   ============================================================================
   Funktionen in schachbrett.c
   ============================================================================ 
*/

/** Zahl zu Spielfigur verwandeln
*   @param  int  iNumber Figuren-Zahl
*   @return char Figuren-Symbol
*/
char changeNumberToToken(int iNumber)
{
    char cToken = '0';

    switch(iNumber)
    {
        case 1:
            cToken = 'X';
            break;
        case 2:
            cToken = 'O';
            break;
        case 3:
            cToken = 'x';
            break;
        case 4:
            cToken = 'o';

    } // select

    return cToken;

} // function


/** 
* Schachbrettkopf erzeugen
* @param void
* @return void
*/
void FillFirst2Lines(void)
{
	int iCol;

    acSchachbrett[0][0] = ' ';

    for (iCol=2;iCol < B_NO_OF_COLS;iCol++) /* Spalten */
        acSchachbrett[0][iCol] = 63+iCol;

    for (iCol=0;iCol< B_NO_OF_COLS;iCol++) /* Spalten */
        acSchachbrett[1][iCol] = FIELD_BORDER_C;

} // function



/** 
* Linken Schachbrettrand erzeugen
* @param  void
* @return void
*/
void FillFirst2Columns(void)
{
        int iRow;

        for (iRow=2; iRow < B_NO_OF_ROWS; iRow++) /* Zeilen */
            acSchachbrett[iRow][0] = 47 + (11 - iRow);

        acSchachbrett[1][1] = FIELD_BORDER_A;

        for (iRow=0;iRow< B_NO_OF_ROWS;iRow++) /* Zeilen */
            acSchachbrett[iRow][1] = FIELD_BORDER_B;
} // function



/** 
* Spielbrett erstellen
* @param void
* @return TRUE / FALSE
*/
int printBoard(void)
{

    int iRow      = 0;
    int iCol      = 0;


    FillFirst2Lines();
    FillFirst2Columns();

    for (iRow= 0; iRow < NO_OF_ROWS; iRow++)
    {
        for (iCol = 0; iCol < NO_OF_COLS; iCol++)
        {
            if ( 0 < aiBoard[NO_OF_ROWS - 1 - iRow][iCol] )
                acSchachbrett[iRow + 2][iCol + 2] = changeNumberToToken(aiBoard[NO_OF_ROWS - 1 - iRow][iCol]);
            else
            {
                if (iRow % 2 == 0)
                {
                    if (iCol % 2 == 0)
                        acSchachbrett[iRow + 2][iCol + 2] = FIELD_A;
                    else
                        acSchachbrett[iRow + 2][iCol + 2] = FIELD_B;
                } // if
                else
                {
                    if (iCol % 2 != 0)
                        acSchachbrett[iRow + 2][iCol + 2] = FIELD_A;
                    else
                        acSchachbrett[iRow + 2][iCol + 2] = FIELD_B;
                } // else
           } // else
        } // for
    } // for


// Schachbrett ausgeben
    for ( iRow = 0; iRow < B_NO_OF_ROWS; iRow++) 
    {
        for (iCol = 0; iCol < B_NO_OF_COLS; iCol++) 
        {
            printf("%c", acSchachbrett[iRow][iCol]);
        } // for
        printf("\n");
    } // for

    return TRUE;

} // function




/**
* Liest Zugeingabe per Tastatur ein
* @param  int          aiMove[2][2]
* @return TRUE / FALSE Eingabe erfolgreich
*/
int getMove(int aiMove[2][2])
{
    int  iCounter = 0; /* Zaehlvariable */
    char acTestStr[256] = {'\0'};
    char acErrorCache[1024] = {'\0'};
    int  iReturn = TRUE;

	for (iCounter = 0; iCounter <= 1; iCounter++)
	{
            if (0 == iCounter)
                printf("\nBitte Startzug eingeben (a1 oder A2, ...)\t");
            else
                printf("Bitte Zielzug eingeben    (a1 oder A2, ...)\t");


            scanf("%s", acTestStr);
            fflush(stdin);

            // Eingabe nicht zwei Zeichen lang
            if ('\0' != acTestStr[2])
            {
                iReturn = FALSE;
                strcat(acErrorCache, "Eingabe fuer Zug darf nur zwei Zeichen lang sein.\n");
            } // if



            //  Erstes Zeichen ist kein kleiner bzw grosser Buchstabe A bis H
            if ( ( 97 <= (int)acTestStr[0]) || ((int)acTestStr[0] <= 104 ) )
            {
            }
            else if ( ( 65 <= (int)acTestStr[0]) || ((int)acTestStr[0] <= 72 ) )
            {
            } // else if
            else
            {
                iReturn = FALSE;
                strcat(acErrorCache, "Erstes Zeichen kein Buchstabe aus (A-H oder a-h).\n");
            } // if


            // Zweites Zeichen ist eine Zahl von 1 bis 8
            if ( ((int)acTestStr[1] < 49 ) || (56 < (int)acTestStr[1]) )
            {
                iReturn = FALSE;
                strcat(acErrorCache, "Zweites Zeichen keine Zahl zwischen (1-8).\n");
            } // if


            if (TRUE == iReturn)
            {
                // kleines a-h ? dann Wertigkeit des Asciizeichens 'a' abziehen
                if ( (97 <= (int)acTestStr[0]) && ((int)acTestStr[0] <= 104) )
                    aiMove[iCounter][COL] = (int)acTestStr[0] - 97;
                else
                    aiMove[iCounter][COL] = (int)acTestStr[0] - 65;

                aiMove[iCounter][ROW] = (int)acTestStr[1] - 49;
            } // if
            else
            {
                if (0 == iCounter )
                    strcat(acErrorMsg, "Erste Eingabe fehlerhaft:\n");
                else
                    strcat(acErrorMsg, "Zweite Eingabe fehlerhaft:\n");

                strcat(acErrorMsg, acErrorCache);
                strcpy(acErrorCache, "");
            } // else
	} // for

    return iReturn;

} // function